package pl.prac03;
// ProcesadorJava01.java

import java.io.*;

import antlr.ANTLRException;
import antlr.CommonToken;
import antlr.RecognitionException;
import antlr.Token;
import antlr.TokenStreamException;
import antlr.collections.AST;
import antlr.ANTLRException;

public class ProcesadorJava01 {
	public String nombre;

	public ProcesadorJava01(String s) {
		this.nombre = s;                
	}

	//Para leer por línea de comandos
	public String Reconocedor2() throws TokenStreamException, IOException {
		
		try {
			InputStreamReader isr =
			new InputStreamReader(System.in);
			BufferedReader br = new BufferedReader(isr);
			String linea = br.readLine();
			Lex analex = null;
			Sint anasint = null;
			while (!linea.equals("$")) {
				analex = new Lex(new StringReader(linea));
				
				/*CommonToken tok = (CommonToken)Lex.nextToken();
				System.out.println("Lexema: "+tok.getText()+" Token:"+tok.getType());
				while (tok.getType()!=Token.EOF_TYPE){
					tok = (CommonToken)Lex.nextToken();
					System.out.println("Lexema: "+tok.getText()+" Token: "+tok.getType());
					}*/
				anasint = new Sint(analex);
				anasint.asignacion();
				while (analex.nextToken().getType()!=1) {}
				System.out.println(analex.toString());
				System.out.println(anasint.toString());
				linea = br.readLine();
			}

		} catch (ANTLRException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "Error ANTL";
		} catch(FileNotFoundException fe) {
	        System.err.println("No se ha leido correctamente");
	        return "Error fichero";
		}

		return "Analisis OK"; 
	}
	
	//Para leer por fichero
	public String Reconocedor() throws TokenStreamException, FileNotFoundException {
				
		try {
            FileInputStream f = new FileInputStream(nombre);
            
			Lex analex = null;
			Sint anasint = null;

			analex = new Lex(f);
			
			//System.out.println("Después Lex");
			anasint = new Sint(analex);
			//System.out.println("Después Sint");

			anasint.entrada();
			//anasint.asignacion();
			//System.out.println("Después Ent");
			//Token t = new Token();
			while (analex.nextToken().getType()!=1) {
				System.out.println(analex.nextToken());
			}
			
			System.out.println(analex.toString());
			System.out.println(anasint.toString());

		} catch (ANTLRException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "Error ANTL";
		} catch(FileNotFoundException fe) {
	        System.err.println("No se encontro el fichero");
	        return "Error fichero";
		}

		return "Analisis OK"; 
	}

	public static void main(String args[]) throws NumberFormatException, IOException {
		String toRet = "";
		try {
			if (args.length==0){
				BufferedReader lectura = new BufferedReader(new InputStreamReader(System.in));
				int num;
				System.out.println("No se ha pasado un fichero por parámetro, que desea hacer:");
				System.out.println("1 - Insertar por teclado ");
				System.out.println("2 - Usar ficheros ya definidos ");
				System.out.println("Ingrese numero: ");
				num = Integer.parseInt(lectura.readLine());
				if (num==1) {
					ProcesadorJava01 PJ = new ProcesadorJava01("");
					toRet=PJ.Reconocedor2();
				}
				else {
					System.out.println("Ficheros de ejemplo:");
					System.out.println("1 - entrada01.txt ");
					System.out.println("2 - entrada02.txt ");
					System.out.println("3 - entrada03.txt ");
					System.out.println("4 - entrada04.txt ");
					System.out.println("5 - entrada05.txt ");
					System.out.println("Ingrese numero: ");
					char op = (char) System.in.read();
					switch (op) {
					case '1': {
						ProcesadorJava01 PJ = new ProcesadorJava01("./ficheros/entrada01.txt");
						toRet=PJ.Reconocedor();
						System.out.println("Entrada01");
						break;
					}
					case '2': {
						ProcesadorJava01 PJ = new ProcesadorJava01("./ficheros/entrada02.txt");
						toRet=PJ.Reconocedor();
						System.out.println("Entrada02");
						break;
					}
					case '3': {
						ProcesadorJava01 PJ = new ProcesadorJava01("./ficheros/entrada03.txt");
						toRet=PJ.Reconocedor();
						System.out.println("Entrada03");
						break;
					}
					case '4': {
						ProcesadorJava01 PJ = new ProcesadorJava01("./ficheros/entrada04.txt");
						toRet=PJ.Reconocedor();
						System.out.println("Entrada04");
						break;
					}
					case '5': {
						ProcesadorJava01 PJ = new ProcesadorJava01("./ficheros/entrada05.txt");
						toRet=PJ.Reconocedor();
						System.out.println("Entrada05");
						break;
					}
					default: { 
						System.out.println("No se ha elejido una opción válida");
						toRet="Elección de fichero. No se ha elejido una opción válida";
						break;
					}
					}
				}
			}
			else {
				ProcesadorJava01 PJ = new ProcesadorJava01(args[0]);
				toRet=PJ.Reconocedor();
			}
				
		} catch (TokenStreamException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
